import request from "../request"
import qs from "qs";

/**
 *  在ts的项目里面，有时候会报这种错：无法找到模块“xxx”的声明文件。
 *  原本在一些比较老的 第三方库 在ts项目中使用的时候，就可能会报这个错
 *  之前在这些第三方库有的时候， 还没有ts ，我们在ts项目使用， 就会没有遵守 ts 的规定，提供 声明文件
 *  所以在ts项目中使用 这些第三方库的时候， ts 认为 这些库不合法， 就会报错
 *
 *  但是这些报错是ts的错， js 代码是完全可以运行了
 *  所以这个时候，为了让ts不报错， 需要提供 对应类库的 声明文件
 *  一般来说这些 库都是在 npm 上下载的，所以 也是直接去 npm 找对应的声明库就行
 *  一般来说 ， 第三方库的 额外的声明文件 命名都： @types/第三库
 *  之前我们在配置  vite.config.ts 的时候我们下载了一个  @types/node
 *  所以我们现在解决 ts 报 qs模块 没有声明文件的错 ， 只需要下载  @types/qs
 *  但是不一定所有的 模块 都有 这些补充声明的 库 -- 这种如何解决我们后面再说
 */

export const loginApi = (params: IloginParams): RSP<ILoginResponse> => request.post("/admin/login", params)

export const userInfoApi = (): RSP<IUserInfoResponse> => request.get("/admin/info")


// 要注意get请求带参数格式和post请求是不一样的
export const getUserListApi = (
    params?: IUserListParams
): RSP<IUserListData<IUserModel>> => request.get("/admin/list", { params });


/**
 *
 *  在文档里面这么几个单词是可以告诉我们指定 参数的位置
 *
 *    path -->  把参数放友url的里面  /admin/update/{id}
 *    query  --->  把参数放在url的search部分   /id/update?id=xxx&name=xxx
 *    body   --->  post请求把数据放在 请求体里面
 *
 */

export const updateUserStatusApi = (
    params: IUpdateUserStatusParams
): RSP<any> =>
    request.post(`/admin/updateStatus/${params.id}?status=${params.status}`); // 这种写法的接口，其实不规范的


// 注册用户的接口
export const registerUserApi = (params: IRegisterUserParams): RSP<IUserModel> =>
    request.post("/admin/register", params);

// 获取指定用户信息的接口
export const getUserInfo = (id: number): RSP<IUserModel> => request.get(`/admin/${id}`)

// 修改指定用户信息的接口
export const updateUserInfo = (params: IUserModel): RSP<any> => request.post(`/admin/update/${params.id}`, params)


// 获取所有角色的列表
export const getRoleListApi = (): RSP<IRoleModel[]> =>
    request.get("/role/listAll");


// 获取指定用户的所有的角色
export const getRoleListByAdminIdApi = (adminId: number): RSP<IRoleModel[]> =>
    request.get(`/admin/role/${adminId}`);

// 给指定用户分配角色 - 注意，文档里面要求我们使用的是query形式的参数
// 以前我们用过一个 qs 的模块，可以快速将一个对象转换为  search(query) 形式的参数
// export const updateRolesApi = (params: IUpdateRolesParams) => {
export const updateRolesApi = ({ adminId, roleIds }: IUpdateRolesParams): RSP<any> => {
    // qs 在转换 数组的时候，有点和我们想要的不一样，所以这个东西，我们还是只能自己转换
    // console.log(qs.stringify(params));
    return request.post(
        `/admin/role/update?adminId=${adminId}&roleIds=${roleIds.join(",")}`

        // qs 模块在转换数组的时候 可以添加一个指定的格式 参数， 让 数组转换成 array=1,2,3,4 的格式
        // console.log(qs.stringify(params, { arrayFormat: "comma" }));
        // `/admin/role/update?${qs.stringify(params, { arrayFormat: "comma" })}`
    );
};


// 分页获取 角色列表
export const queryRoleListApi = (
    params: IUserListParams
): RSP<IUserListData<IRoleModel>> => request.get("/role/list", { params });






// 查询所有后台资源请求  
export const getAllResourceApi = (): RSP<IRourceModel[]> => request.get('/resource/listAll')

// 查询后台资源分类管理请求
export const getAllResourceCategoryApi = (): RSP<IResourceCategoryModel[]> => request.get("/resourceCategory/listAll")

// 获取角色相关资源
export const getListRoleResourceApi = (roleId: number): RSP<IRourceModel[]> => request.get(`/role/listResource/${roleId}`)

// 给角色分配资源请求
export const allocResourceApi = (params: IAllocResourceParams): RSP<any> => request.post("/role/allocResource?" + qs.stringify(params, { arrayFormat: "comma" }))